package com.ourway.dtos;

import cn.hutool.core.annotation.Alias;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 飞书更新用户业务类
 *
 * @author liuweiheng
 * @since 2021/12/12
 */
@Data
@Accessors(chain = true)
@Builder
public class FeiShuUserUpdateDTO implements Serializable {

    /**
     * 名称
     */
    @JsonProperty("name")
    private String name;
    /**
     * 手机号
     */
    @JsonProperty("mobile")
    private String mobile;
    /**
     * 部门ID列表
     */
    @JsonProperty("department_ids")
    @Alias("department_ids")
    private String[] departmentIds;
    /**
     * 领导ID
     */
    @JsonProperty("leader_user_id")
    @Alias("leader_user_id")
    private String leaderUserId;
    /**
     * 性别
     * 0：保密
     * 1：男
     * 2：女
     */
    @JsonProperty("gender")
    private Integer gender;
    /**
     * 邮箱
     */
    @JsonProperty("email")
    private String email;
    /**
     * 员工号
     */
    @JsonProperty("employee_no")
    @Alias("employee_no")
    private String employeeNo;
    /**
     * 员工类型
     */
    @JsonProperty("employee_type")
    @Alias("employee_type")
    private String employeeType;

    /**
     * UserDTO转换为FeiShuUserUpdateDto
     * @param userDTO 用户信息
     * @return 飞书更新用户信息对象
     */
    public static FeiShuUserUpdateDTO userDto2FeiShuUserUpdateDto(UserDTO userDTO) {
        return FeiShuUserUpdateDTO.builder()
                .name(userDTO.getName())
                .mobile(userDTO.getMobile())
                .departmentIds(new String[]{ userDTO.getDepartmentSyncId() })
                .leaderUserId(userDTO.getManagerSyncId())
                .gender(Integer.parseInt(userDTO.getGender()))
                .email(userDTO.getEmail())
                .employeeNo(userDTO.getUserNo())
                .employeeType("1")
                .build();
    }

    public void setNoneUpdatePropertyNull(FeiShuUserUpdateDTO old) {
        Class<FeiShuUserUpdateDTO> clazz = FeiShuUserUpdateDTO.class;
        List<Field> allFields = new ArrayList<>(100);
        allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        allFields.forEach(field -> {

            // 设置字段可访问， 否则无法访问private修饰的变量值
            field.setAccessible(true);
            try {
                // 获取字段名称
                String fieldName = field.getName();

                // 获取指定对象的当前字段的值
                String oldValue = String.valueOf(field.get(old));
                String newValue = String.valueOf(field.get(this));
                if (oldValue.equals(newValue)) {
                    field.set(this, null);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
    }
}
